package com.newx.common.core.utils;

import com.newx.common.core.exception.ServiceException;
import org.apache.commons.lang3.StringUtils;

import java.util.Collection;
import java.util.Map;

/**
 * 断言工具类
 */
public class ObjectAssertions {

    /**
     * 断言对象不为空
     *
     * @param obj 要检查的对象
     * @param msg 错误消息
     */
    public static void isNull(Object obj, String msg) {
        if (obj == null) {
            throw new ServiceException(MessageUtils.message(msg));
        }
    }

    /**
     * 断言对象不为空
     *
     * @param obj 要检查的对象
     * @param msg 错误消息
     */
    public static void isNull(Object obj, String msg, Object... args) {
        if (obj == null) {
            throw new ServiceException(MessageUtils.message(msg, args));
        }
    }

    /**
     * 断言字符串为空
     *
     * @param str 要检查的字符串
     * @param msg 错误消息
     */
    public static void blank(String str, String msg) {
        if (StringUtils.isBlank(str)) {
            throw new ServiceException(MessageUtils.message(msg));
        }
    }

    /**
     * 断言集合不为空
     *
     * @param collection 要检查的集合
     * @param msg        错误消息
     */
    public static void isEmpty(Collection<?> collection, String msg) {
        if (collection == null || collection.isEmpty()) {
            throw new ServiceException(MessageUtils.message(msg));
        }
    }

    /**
     * 断言映射不为空
     *
     * @param map 要检查的映射
     * @param msg 错误消息
     */
    public static void notEmpty(Map<?, ?> map, String msg) {
        if (map == null || map.isEmpty()) {
            throw new ServiceException(MessageUtils.message(msg));
        }
    }

    /**
     * 断言表达式为真
     *
     * @param expression 要检查的布尔表达式
     * @param msg        错误消息
     */
    public static void isTrue(boolean expression, String msg) {
        if (expression) {
            throw new ServiceException(MessageUtils.message(msg));
        }
    }

    /**
     * 断言表达式为真
     *
     * @param expression 要检查的布尔表达式
     * @param msg        错误消息
     */
    public static void isTrue(boolean expression, String msg, Object... args) {
        if (expression) {
            throw new ServiceException(MessageUtils.message(msg, args));
        }
    }

    /**
     * 断言对象为指定类型
     *
     * @param obj  要检查的对象
     * @param type 期望的类型
     * @param msg  错误消息
     */
    public static void instanceOf(Object obj, Class<?> type, String msg) {
        if (!type.isInstance(obj)) {
            throw new ServiceException(MessageUtils.message(msg));
        }
    }

    /**
     * 断言数字为正数
     *
     * @param number 要检查的数字
     * @param msg    错误消息
     */
    public static void positive(Number number, String msg) {
        if (number == null || number.doubleValue() <= 0) {
            throw new ServiceException(MessageUtils.message(msg));
        }
    }

    // 私有构造函数，防止实例化
    private ObjectAssertions() {
        throw new IllegalStateException("工具类");
    }
}


